package org.example.springboot.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import org.example.springboot.common.Result;
import org.example.springboot.entity.InstockApply;
import org.example.springboot.service.InstockApplyService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

import java.util.List;
//Swagger 描述注解，说明此接口的用途。
@Tag(name = "入库申请接口")
//Spring 注解，表明该类是一个控制器，并且每个方法的返回值直接写入 HTTP 响应体中（用于构建 RESTful Web 服务）。
@RestController
//定义基础请求路径为 /instock。
@RequestMapping("/instock")
public class InstockApplyController {
    private static final Logger LOGGER = LoggerFactory.getLogger(InstockApplyController.class);

    @Resource
    private InstockApplyService instockApplyService;

    @Operation(summary = "创建入库申请")
    //处理 POST 请求，路径为 /instock。
    @PostMapping
    //调用服务层方法创建入库申请。
    //@RequestBody InstockApply apply：接收客户端发送的 JSON 数据并反序列化为 InstockApply 对象。
    //return instockApplyService.createApply(apply);：调用服务层方法创建入库申请。
    public Result<?> createApply(@RequestBody InstockApply apply) {
        return instockApplyService.createApply(apply);
    }

    @Operation(summary = "更新入库申请")
  //@PutMapping("/{id}")：处理 PUT 请求，路径为 /instock/{id}，其中 {id} 是路径变量
    @PutMapping("/{id}")
//@PathVariable Long id：获取 URL 中的 id 参数。
    //@RequestBody InstockApply apply：接收客户端发送的 JSON 数据并反序列化为 InstockApply 对象。
    //return instockApplyService.updateApply(id, apply);：调用服务层方法更新指定 id 的入库申请。
    public Result<?> updateApply(@PathVariable Long id, @RequestBody InstockApply apply) {
        return instockApplyService.updateApply(id, apply);
    }

    @Operation(summary = "审批入库申请")
    //@PutMapping("/{id}/approve")：处理 PUT 请求，路径为 /instock/{id}/approve。
    @PutMapping("/{id}/approve")
    //@PathVariable Long id：获取 URL 中的 id 参数。
    //@RequestParam Integer approvalStatus：接收审批状态参数
    //@RequestParam String approvalComment：接收审批意见参数。
    //@RequestParam Long approverId：接收审批人 ID 参数。
    public Result<?> approveApply(@PathVariable Long id, @RequestParam Integer approvalStatus, @RequestParam String approvalComment, @RequestParam Long approverId) {
        //调用服务层方法对指定 id 的入库申请进行审批。
        return instockApplyService.approveApply(id, approvalStatus, approvalComment, approverId);
    }


    @Operation(summary = "获取入库申请详情")
    //@GetMapping("/{id}")：处理 GET 请求，路径为 /instock/{id}。
    @GetMapping("/{id}")
    //@PathVariable Long id：获取 URL 中的 id 参数。
    //return instockApplyService.getApplyById(id);：调用服务层方法获取指定 id 的入库申请详情。
    public Result<?> getApplyById(@PathVariable Long id) {
        return instockApplyService.getApplyById(id);
    }

    @Operation(summary = "分页查询入库申请")
    //处理 GET 请求，路径为 /instock/page。
    @GetMapping("/page")
    public Result<?> getApplysByPage(
            //可选参数，用于筛选特定类型的入库申请。
            @RequestParam(required = false) Integer applyType,
            //可选参数，用于筛选特定状态的入库申请。
            @RequestParam(required = false) Integer status,
            //可选参数，用于筛选特定申请人的入库申请。
            @RequestParam(required = false) Long applicantId,
            //当前页码，默认为 1。
            @RequestParam(defaultValue = "1") Integer currentPage,
            //每页显示的记录数，默认为 10。
            @RequestParam(defaultValue = "10") Integer pageSize) {
        //调用服务层方法实现分页查询入库申请。
        return instockApplyService.getApplysByPage(applyType, status, applicantId, currentPage, pageSize);
    }

    @Operation(summary = "删除入库申请")
    //处理 DELETE 请求，路径为 /instock/{id}。
    @DeleteMapping("/{id}")
    //return instockApplyService.deleteApply(id);：调用服务层方法删除指定 id 的入库申请。
    public Result<?> deleteApply(@PathVariable Long id) {
        return instockApplyService.deleteApply(id);
    }
    // 批量删除
    @Operation(summary = "批量删除入库申请")
    //处理 DELETE 请求，路径为 /instock/batch。
    @DeleteMapping("/batch")
    //@RequestBody List<Long> ids：接收客户端发送的 JSON 数据并反序列化为 List<Long> 类型，表示要删除的多个 id。
    //return instockApplyService.deleteBatch(ids);：调用服务层方法批量删除指定的入库申请。
    public Result<?> deleteBatch(@RequestBody List<Long> ids) {
        return instockApplyService.deleteBatch(ids);
    }
} 